package org.test.comun;

import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.log4j.Logger;
import org.test.reporte.DefinicionReporte;

public class Configuracion {

	static Logger logger = Logger.getLogger(Configuracion.class);
	
	private static Configuracion instance;
	
	private static Configuration propertiesConfig;
	
	private static final String PROP_FILE_NAME = "configuracion.properties";
	
	private static Map<String, DefinicionReporte> reportes;
	
	private Configuracion () {
		try {
			propertiesConfig = new PropertiesConfiguration(PROP_FILE_NAME);
		} catch (ConfigurationException e) {
			logger.error("Error levantando configuracion");
		}
	}
	
	public static Configuracion getInstance() {
		if (instance == null) {
			instance = new Configuracion();
		}
		return instance;
	}
	
	public Map<String, DefinicionReporte> getReportes() {
		if (reportes == null) {
			reportes = new HashMap<String, DefinicionReporte>();
			loadReportsDefinition();
		}
		return reportes;
	}

	private void loadReportsDefinition() {
		reportes.clear();
		
		String[] reportesStrs = propertiesConfig.getStringArray(Constantes.KEY_DEFINICION_REPORTES);
		for (int i = 0; i < reportesStrs.length; i++) {
			DefinicionReporte defReporte = new DefinicionReporte();
			defReporte.setNombreReporte(reportesStrs[i].trim());
			
			String keyNombreArchivo = MessageFormat.format(Constantes.KEY_REPORTE_ARCHIVO_NOMBRE_PATTERN, new Object [] {defReporte.getNombreReporte()});
			defReporte.setNombreArchivo(propertiesConfig.getString(keyNombreArchivo).trim());
			
			String keyConsultaSQL = MessageFormat.format(Constantes.KEY_REPORTE_CONSULTA_SQL_PATTERN, new Object [] {defReporte.getNombreReporte()});
			defReporte.setConsultaSql(rebuildQueryFromProperty(propertiesConfig.getStringArray(keyConsultaSQL)));
		
			reportes.put(defReporte.getNombreReporte(), defReporte);
		}
	}

	private String rebuildQueryFromProperty(String[] queryParts) {
		String query ="";
		for (int j = 0; j < queryParts.length; j++) {
			if (j != 0) {
				query += ",";
			}
			query += queryParts[j];
		}
		return query;
	}

}
